home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 July / macformat-026.iso / mac / Shareware City / Science / µSim 1.0 folder / source / Preferences.c < prev    next >
Encoding:
Text File  |  1995-01-30  |  7.7 KB  |  267 lines  |  [TEXT/MMCC]

  1. /*
  2. Copyright © 1993,1994 by Fabrizio Oddone
  3. ••• ••• ••• ••• ••• ••• ••• ••• ••• •••
  4. This source code is distributed as freeware: you can copy, exchange, modify this
  5. code as you wish. You may include this code in any kind of application: freeware,
  6. shareware, or commercial, provided that full credits are given.
  7. You may not sell or distribute this code for profit.
  8. */
  9.  
  10. //#pragma load "MacDump"
  11.  
  12. #include    "UtilsSys7.h"
  13. #include    "Disasm.h"
  14. #include    "DoEditDialog.h"
  15. #include    "DoMenu.h"
  16. #include    "DragManSim.h"
  17. #include    "Dump.h"
  18. #include    "Globals.h"
  19. #include    "MovableModal.h"
  20. #include    "Preferences.h"
  21. #include    "Main.h"
  22. #include    "Registers.h"
  23. #include    "Conversions.h"
  24.  
  25. #if defined(FabSystem7orlater)
  26.  
  27. static Boolean PrefsPreProcessKey(EventRecord *thEv, DialogPtr theD);
  28. static pascal Boolean PrefsFilter(DialogPtr theD, EventRecord *thEv, short *iHit);
  29. static void SetTopLeft(Point *thePt, WindowPtr w);
  30.  
  31. #pragma segment Rare
  32.  
  33. enum {
  34. kItemRememberWindPos = 3,
  35. kItemContinuousDumpScroll,
  36. kItemInfLoopsDetect,
  37. kItemInitialPCVal,
  38. kItemInitialSPVal,
  39. kItemStackSize
  40. };
  41.  
  42. void Preferences(void)
  43. {
  44. enum {
  45. kDLOG_Prefs = 262
  46. };
  47.  
  48. Str255    InitPCStr, InitSPStr, StackSizeStr;
  49. long    dummy;
  50.  
  51. dialogItems    things[] = {{ ok, 0, 1L },
  52.                         { cancel, 0, 0L },
  53.                         { kItemRememberWindPos, 0, 0L },
  54.                         { kItemContinuousDumpScroll, 0, 0L },
  55.                         { kItemInfLoopsDetect, 0, 0L },
  56.                         { kItemInitialPCVal, 0, 0L },
  57.                         { kItemInitialSPVal, 0, 0L },
  58.                         { kItemStackSize, 0, 0L },
  59.                         { 0, 0, 0L}
  60.                         };
  61.  
  62. things[kItemRememberWindPos-1].refCon = gPrefs.remembWind;
  63. things[kItemContinuousDumpScroll-1].refCon = gPrefs.NeXTScroll;
  64. things[kItemInfLoopsDetect-1].refCon = gPrefs.infLoopsDetect;
  65. things[kItemInitialPCVal-1].refCon = (long)&InitPCStr;
  66. things[kItemInitialSPVal-1].refCon = (long)&InitSPStr;
  67. things[kItemStackSize-1].refCon = (long)&StackSizeStr;
  68.  
  69. ShortToHexString(gPrefs.DefPCValue, InitPCStr);
  70. ShortToHexString(gPrefs.DefSPValue, InitSPStr);
  71. MyNumToString(gPrefs.DefStkSize, StackSizeStr);
  72.  
  73. if (HandleMovableModalDialog(things, gPrefs.remembWind ? &gPrefs.generalPrefsTL : nil, nil, nil, nil, nil, nil,
  74.     AdjustMenus,
  75.     Handle_My_Menu,
  76.     DomyKeyEvent,
  77.     PrefsPreProcessKey,
  78.     nil,
  79.     DoUpdate,
  80.     DoActivate,
  81.     DoHighLevelEvent,
  82.     DoOSEvent,
  83.     DoIdle,
  84.     ULONG_MAX,
  85.     kDLOG_Prefs) == ok) {
  86.     gPrefs.remembWind = things[kItemRememberWindPos-1].refCon;
  87.     gPrefs.NeXTScroll = things[kItemContinuousDumpScroll-1].refCon;
  88.     gPrefs.infLoopsDetect = things[kItemInfLoopsDetect-1].refCon;
  89.     HexStringToShort(InitPCStr, (short *)&gPrefs.DefPCValue);
  90.     HexStringToShort(InitSPStr, (short *)&gPrefs.DefSPValue);
  91.     StringToNum(StackSizeStr, &dummy);
  92.     gPrefs.DefStkSize = dummy;
  93.     }
  94. }
  95.  
  96. Boolean PrefsPreProcessKey(EventRecord *thEv, DialogPtr theD)
  97. {
  98. short    iHit;
  99. unsigned char    keypressed;
  100. Boolean    result = true;
  101.  
  102. keypressed = CHARFROMMESSAGE(thEv->message);
  103. if ((keypressed >= 'a') && (keypressed <= 'z')) {
  104.     keypressed -= 'a' - 'A';    /* cambiare! */
  105.     CHARFROMMESSAGE(thEv->message) = keypressed;
  106.     }
  107. iHit = ((DialogPeek)theD)->editField + 1;
  108. if (keypressed >= 32 && ((thEv->modifiers & cmdKey) == 0)) {
  109.     switch (iHit) {
  110.         case kItemInitialPCVal:
  111.         case kItemInitialSPVal:
  112.             result = ( Munger((Handle)GetString(kSTR_HEXALLOWED), 1L, &keypressed,
  113.                             1L, 0L, 0L) >= 0L );
  114.             break;
  115.         case kItemStackSize:
  116.             result = ( Munger((Handle)GetString(kSTR_DECALLOWED), 1L, &keypressed,
  117.                             1L, 0L, 0L) >= 0L );
  118.             break;
  119.         }
  120.     }
  121. return result;
  122. }
  123.  
  124. /* PrefsFilter: the filterProc routine for the Prefs dialog */
  125. /*
  126. static pascal Boolean PrefsFilter(DialogPtr theD, EventRecord *thEv, short *iHit)
  127. {
  128. GrafPtr    savePort;
  129. unsigned char    keypressed;
  130. register Boolean    retVal;
  131.  
  132. switch(thEv->what) {
  133.     case keyDown    :
  134.     case autoKey    :
  135.         keypressed = CHARFROMMESSAGE(thEv->message);
  136.         if ((keypressed >= 'a') && (keypressed <= 'z')) {
  137.             keypressed -= 'a' - 'A';    // cambiare!
  138.             CHARFROMMESSAGE(thEv->message) = keypressed;
  139.             }
  140.         if ((keypressed >= 32) && (keypressed != 0x7F) && ((thEv->modifiers & cmdKey) == 0)) {
  141.             *iHit = ((DialogPeek)theD)->editField + 1;
  142.             switch( *iHit ) {
  143.                 case kItemInitialPCVal:
  144.                 case kItemInitialSPVal:
  145.                     return( Munger((Handle)GetString(kSTR_HEXALLOWED), 1L, &keypressed,
  146.                                     1L, 0L, 0L) < 0L );
  147.                     break;
  148.                 case kItemStackSize:
  149.                     return( Munger((Handle)GetString(kSTR_DECALLOWED), 1L, &keypressed,
  150.                                     1L, 0L, 0L) < 0L );
  151.                     break;
  152.                 }
  153.             }
  154.         break;
  155.     case updateEvt:
  156.         if (theD != (DialogPtr)thEv->message) {
  157.             DoUpdate(thEv);
  158.             *iHit = kfakeUpdateItem;
  159.             return true;
  160.             }
  161.         break;
  162.     case activateEvt:
  163.         if (theD != (DialogPtr)thEv->message) {
  164.             DoActivate(thEv);
  165.             *iHit = kfakeUpdateItem;
  166.             return true;
  167.             }
  168.         break;
  169.     }
  170. GetPort(&savePort);
  171. SetPort(theD);
  172. retVal = StdFilterProc(theD, thEv, iHit);
  173. SetPort(savePort);
  174. return retVal;
  175. }
  176. */
  177. #pragma segment CleanUp
  178.  
  179. /* SavePreferencesFile: in the end we save our gPrefs */
  180.  
  181. void SavePreferencesFile(void)
  182. {
  183. ParamBlockRec    myPB;
  184. EventRecord    dummyEv;
  185. FSSpec    myFSS;
  186. register Handle    myStrHand;
  187. short    prefsFRefNum;
  188. Boolean    targetFolder, isAnAlias;
  189. register OSErr    err;
  190. register SignedByte    oldState;
  191.  
  192. oldState = WantThisHandleSafe(myStrHand = (Handle)GetString(kSTR_PREFSFILENAME));
  193. if ((err = FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder,
  194.             &myFSS.vRefNum, &myFSS.parID)) == noErr) {
  195.     err = FSMakeFSSpecCompat(myFSS.vRefNum, myFSS.parID, (ConstStr255Param)*myStrHand, &myFSS);
  196.     if ((err == noErr) || (err == fnfErr)) {
  197.         if (err == fnfErr)
  198. #ifndef __SCRIPT__
  199. #define    smSystemScript    -1
  200. #endif
  201.             err = FSpCreateCompat(&myFSS, '????', kPreferencesFolderType, smSystemScript);
  202.         if (err == noErr)
  203.             if ((err = ResolveAliasFile(&myFSS, true, &targetFolder, &isAnAlias)) == noErr)
  204.                 if (targetFolder)
  205.                     err = paramErr;
  206.                 else
  207.                     if ((err = FSpOpenDFCompat(&myFSS, fsWrPerm, &prefsFRefNum)) == noErr) {
  208.                         SetTopLeft(&gPrefs.AnimTopLeft, gWPtr_Animation);
  209.                         SetTopLeft(&gPrefs.RegsTopLeft, gWPtr_Registers);
  210.                         gPrefs.RegsBase = GetControlValue(Ctrl_Base);
  211.                         gPrefs.IOUserState = (*(WStateDataHandle)((WindowPeek)gWPtr_IO)->dataHandle)->userState;
  212.                         SetTopLeft(&gPrefs.MProgTopLeft, gWPtr_Microprogram_Ed);
  213.                         SetTopLeft(&gPrefs.DumpTopLeft, gWPtr_Dump);
  214.                         gPrefs.DumpHeight = PRCT_B(gWPtr_Dump) - PRCT_T(gWPtr_Dump);
  215.                         gPrefs.DumpScrollVal = GetControlValue(dumpVScroll);
  216.                         SetTopLeft(&gPrefs.DisasmTopLeft, gWPtr_Disasm);
  217.                         gPrefs.DisasmHeight = PRCT_B(gWPtr_Disasm) - PRCT_T(gWPtr_Disasm);
  218.                         gPrefs.DisasmScrollVal = GetControlValue(disasmVScroll);
  219.                         gPrefs.AnimVisible = ((WindowPeek)gWPtr_Animation)->visible;
  220.                         gPrefs.RegsVisible = ((WindowPeek)gWPtr_Registers)->visible;
  221.                         gPrefs.IOVisible = ((WindowPeek)gWPtr_IO)->visible;
  222.                         gPrefs.DumpVisible = ((WindowPeek)gWPtr_Dump)->visible;
  223.                         gPrefs.DisasmVisible = ((WindowPeek)gWPtr_Disasm)->visible;
  224.                         myPB.ioParam.ioCompletion = 0L;
  225.                         myPB.ioParam.ioRefNum = prefsFRefNum;
  226.                         myPB.ioParam.ioBuffer = (Ptr)&gPrefs;
  227.                         myPB.ioParam.ioReqCount = sizeof(struct myprefs);
  228.                         myPB.ioParam.ioPosMode = fsFromStart;
  229.                         myPB.ioParam.ioPosOffset = 0L;
  230.                         (void)PBWriteAsync(&myPB);
  231.                         while (myPB.ioParam.ioResult > 0) {
  232.                             SystemTask();
  233.                             (void)EventAvail(everyEvent, &dummyEv);
  234.                             }
  235.                         (void)FSClose(prefsFRefNum);
  236.                         if ((err = myPB.ioParam.ioResult) == noErr)
  237.                             err = AddSTRRes2Doc(&myFSS, '????', kPreferencesFolderType,
  238.                                                 kSTR_NOOPENORPRINT, smSystemScript);
  239.                         }
  240.         }
  241.     }
  242. HSetState(myStrHand, oldState);
  243. }
  244.  
  245. /* SetTopLeft: common routine which calculates the topLeft coordinate
  246. of a GrafPort’s portRect in global coordinates;
  247. it _changes_ the current port */
  248.  
  249. static void SetTopLeft(Point *thePt, GrafPtr w)
  250. {
  251. *thePt = topLeft(w->portRect);
  252. SetPort(w);
  253. LocalToGlobal(thePt);
  254. }
  255.  
  256. void CleanUp(void)
  257. {
  258. if (gDragManagerActive) {
  259.     MyRemoveHWindow(gWPtr_Registers);
  260.     MyRemoveHWindow(gWPtr_Disasm);
  261.     MyRemoveHWindow(gWPtr_Dump);
  262.     }
  263. }
  264.  
  265. #endif
  266.  
  267.